package com.topfun.utils;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;

/**
 * 用于反射设置类属性
 *
 * @author Administrator
 */
@SuppressWarnings("unused")
public class FieldConverter {
    public static void setValue(Field field, Object obj, Object value) throws Exception {
        if (value != null) {
            Class<?> type = field.getType();
            field.setAccessible(true);
            if (type.getName().equals("int")) {
                field.setInt(obj, getIntValue(value));
            } else if (type.getName().equals("long")) {
                field.setLong(obj, getLongValue(value));
            } else if (type.getName().equals("short")) {
                field.setShort(obj, getShortValue(value));
            } else if (type.getName().equals("boolean")) {
                field.setBoolean(obj, (Boolean) value);
            } else if (type.getName().equals("char")) {
                field.setChar(obj, getCharValue(value));
            } else if (type.getName().equals("double")) {
                field.setDouble(obj, getDoubleValue(value));
            } else if (type.getName().equals("float")) {
                field.setFloat(obj, getFloatValue(value));
            } else if (type.getName().equals("byte")) {
                field.setByte(obj, (Byte) value);
            } else if (type.equals(String.class)) {
                field.set(obj, value.toString());
            } else {
                field.set(obj, value);
            }
        }
    }

    private static int getIntValue(Object value) {
        if (value.getClass().equals(Integer.class)) {
            return (Integer) value;
        } else if (value.getClass().equals(Long.class)) {
            return ((Long) value).intValue();
        } else if (value.getClass().equals(Short.class)) {
            return ((Short) value).intValue();
        } else if (value.getClass().equals(Float.class)) {
            return ((Float) value).intValue();
        } else if (value.getClass().equals(Double.class)) {
            return ((Double) value).intValue();
        } else if (value.getClass().equals(BigDecimal.class)) {
            return ((BigDecimal) value).intValue();
        } else if (value.getClass().equals(String.class)) {
            return Integer.valueOf(value.toString());
        } else {
            throw new IllegalArgumentException("The value '" + value + "' is not a numeric.");
        }
    }

    private static short getShortValue(Object value) {
        if (value.getClass().equals(Short.class)) {
            return (Short) value;
        } else if (value.getClass().equals(Integer.class)) {
            return ((Integer) value).shortValue();
        } else if (value.getClass().equals(Long.class)) {
            return ((Long) value).shortValue();
        } else if (value.getClass().equals(Float.class)) {
            return ((Float) value).shortValue();
        } else if (value.getClass().equals(Double.class)) {
            return ((Double) value).shortValue();
        } else if (value.getClass().equals(BigDecimal.class)) {
            return ((BigDecimal) value).shortValue();
        } else if (value.getClass().equals(Boolean.class)) {
            return ((Boolean) value) ? (short) 1 : (short) 0;
        } else if (value.getClass().equals(String.class)) {
            return Short.valueOf(value.toString());
        } else {
            throw new IllegalArgumentException("The value '" + value + "' is not a numeric.");
        }
    }

    private static char getCharValue(Object value) {
        if (value.getClass().equals(Character.class)) {
            return (Character) value;
        } else if (value.getClass().equals(Integer.class)) {
            return (char) ((Integer) value).intValue();
        } else if (value.getClass().equals(Short.class)) {
            return (char) ((Short) value).intValue();
        } else {
            throw new IllegalArgumentException("The value '" + value + "' is not a character.");
        }
    }

    private static long getLongValue(Object value) {
        if (value.getClass().equals(Long.class)) {
            return (Long) value;
        } else if (value.getClass().equals(Integer.class)) {
            return ((Integer) value).longValue();
        } else if (value.getClass().equals(Short.class)) {
            return ((Short) value).longValue();
        } else if (value.getClass().equals(Float.class)) {
            return ((Float) value).longValue();
        } else if (value.getClass().equals(Double.class)) {
            return ((Double) value).longValue();
        } else if (value.getClass().equals(BigDecimal.class)) {
            return ((BigDecimal) value).longValue();
        } else if (value.getClass().equals(BigInteger.class)) {
            return ((BigInteger) value).longValue();
        } else if (value.getClass().equals(String.class)) {
            return Long.valueOf(value.toString());
        } else {
            throw new IllegalArgumentException("The value '" + value + "' is not a numeric.");
        }
    }

    private static float getFloatValue(Object value) {
        if (value.getClass().equals(Float.class)) {
            return (Float) value;
        } else if (value.getClass().equals(Integer.class)) {
            return ((Integer) value).floatValue();
        } else if (value.getClass().equals(Short.class)) {
            return ((Short) value).floatValue();
        } else if (value.getClass().equals(Long.class)) {
            return ((Long) value).floatValue();
        } else if (value.getClass().equals(Double.class)) {
            return ((Double) value).floatValue();
        } else if (value.getClass().equals(BigDecimal.class)) {
            return ((BigDecimal) value).floatValue();
        } else if (value.getClass().equals(String.class)) {
            return Float.valueOf(value.toString());
        } else {
            throw new IllegalArgumentException("The value '" + value + "' is not a numeric.");
        }
    }

    private static double getDoubleValue(Object value) {
        if (value.getClass().equals(Double.class)) {
            return (Double) value;
        } else if (value.getClass().equals(Integer.class)) {
            return ((Integer) value).doubleValue();
        } else if (value.getClass().equals(Short.class)) {
            return ((Short) value).doubleValue();
        } else if (value.getClass().equals(Long.class)) {
            return ((Long) value).doubleValue();
        } else if (value.getClass().equals(Float.class)) {
            return ((Float) value).doubleValue();
        } else if (value.getClass().equals(BigDecimal.class)) {
            return ((BigDecimal) value).doubleValue();
        } else if (value.getClass().equals(String.class)) {
            return Double.valueOf(value.toString());
        } else {
            throw new IllegalArgumentException("The value '" + value + "' is not a numeric.");
        }
    }

    public static void setValueWithStringParsed(Field field, Object obj, String value) throws Exception {
        Class<?> type = field.getType();
        field.setAccessible(true);
        if (type.equals(Integer.class) || type.getName().equals("int")) {
            field.setInt(obj, Integer.valueOf(value));
        } else if (type.equals(Long.class) || type.getName().equals("long")) {
            field.setLong(obj, Long.valueOf(value));
        } else if (type.equals(Short.class) || type.getName().equals("short")) {
            field.setShort(obj, Short.valueOf(value));
        } else if (type.equals(Boolean.class) || type.getName().equals("boolean")) {
            field.setBoolean(obj, Boolean.valueOf(value));
        } else if (type.equals(Double.class) || type.getName().equals("double")) {
            field.setDouble(obj, Double.valueOf(value));
        } else if (type.equals(Float.class) || type.getName().equals("float")) {
            field.setFloat(obj, Float.valueOf(value));
        } else if (type.equals(Byte.class) || type.getName().equals("byte")) {
            field.setByte(obj, Byte.valueOf(value));
        } else {
            field.set(obj, value);
        }
    }
}
